package com.demo3_求最长子串.滑动窗口;
/**
 * 确实存索引比较方便, 但是这个细节问题也比较多 ~
 */

import java.util.HashMap;

public class Solution {
    public static void main(String[] args) {
        String s="abcabcbb";

        System.out.println(new Solution().lengthOfLongestSubstring(s));

    }
    public static int lengthOfLongestSubstring(String s) {
        if (s==null){
            return 0;
        }
        if (s.length()==0){
            return 0;
        }

        int startIndex=0;

        int maxLength=0;
        HashMap<Character, Integer> map = new HashMap<>();
        // 使用map 来 key 存 字符, value 存下标
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(s.charAt(i))){
                //获取该字符的索引 value
                Integer index = map.get(s.charAt(i));
                // 避免找到起始索引之前的
                if (index>=startIndex){
                    int len=i-startIndex;
                    startIndex=index+1; //  必须每次向前走
                    maxLength=maxLength==0?len:Math.max(maxLength,len);

                }
                // 不论是不是在 startIndex 之前都应该更新这个重复的key的索引
                map.put(s.charAt(i),i);// 更新该key 的索引

            }
            map.put(s.charAt(i),i);
            if(i==s.length()-1){
                int len=i-startIndex+1;
                maxLength=maxLength==0?len:Math.max(maxLength,len);
            }
        }

        return maxLength;
    }
}
